package queue;

import java.util.Scanner;

public class ArrQueueDemo {
    public static void main(String[] args) {
        // 测试队列的主要功能
        int maxSize = 3;
        ArrayQueue aq = new ArrayQueue(maxSize);
        Scanner sc = new Scanner(System.in);
        boolean loop = true;
        while (loop) {
            System.out.println("请根据提示输入字母：");
            System.out.println("a(add) ---> 表示向队列中添加元素");
            System.out.println("g(get) ---> 表示取出队列中的元素");
            System.out.println("s(scan) ---> 表示浏览队列中现有的元素");
            System.out.println("h(head) ---> 表示查看当前队列的头元素");
            System.out.println("e(exit) ---> 表示退出程序");
            String in = sc.next();
            switch (in) {
                case "a" :
                    System.out.println("输入要添加的数字：");
                    int numIn = sc.nextInt();
                    aq.addElement(numIn);
                    break;
                case "g" :
                    System.out.println(aq.getElement());
                    break;
                case "s" :
                    aq.printAllElement();
                    break;
                case "h" :
                    System.out.println(aq.head());
                    break;
                case "e" :
                    return;
                default:
                    continue;
            }
        }
        System.out.println("程序退出~~");
    }
}
// 使用数组模拟队列
class ArrayQueue {
    private int maxSize; // 表示队列的最大容量
    private int front; // 队列头
    private int rear; // 队列尾部
    private int[] arr; // 该数组用于存放数据,模拟队列

    // 创建队列的构造方法
    public ArrayQueue(int maxSize) {
        this.maxSize = maxSize;
        front = -1; // front指向头元素的前一个位置
        rear = -1; // rear指向末尾元素
        arr = new int[maxSize];
    }

    // 判断队列是否为满
    public boolean isFull () {
        return rear == maxSize - 1;
    }

    // 向队列中添加一个元素
    public void addElement (int element) {
        // 首先要判断队列是否满了
        if (isFull()) {
//            throw new RuntimeException("队列已满，无法添加元素！"); // throw一个问题就直接终止程序
            System.out.println("队列已满，无法添加元素！");
            return;
        }
        arr[rear + 1] = element;
        rear++;
    }

    // 判断队列是否为空
    public boolean isEmpty () {
        return rear == front;
    }

    // 取出队列中的一个元素
    public int getElement () {
        // 首先要判断队列是否为空
        if (isEmpty()) {
            throw new RuntimeException("队列为空不能取出元素！");
        }
        front++; // front是指向队头元素的前一个位置！！！
        return arr[front];
    }

    // 显示队列中的所有数据
    public void printAllElement () {
        // 判断当前队列是否为空
        if (isEmpty()) {
            System.out.println("当前队列为空~~");
            return;
        }
        for (int i = front + 1; i <= rear; i++) {
            System.out.printf("arr[%d] = " + arr[i] + "\n" , i);
        }
    }

    // 查看队列当前的头元素
    public int head () {
        return arr[front + 1];
    }
}